/* 定义模块，用于管理购物车状态数据 */
const cartModule = {
  namespaced: true, // 启用命名空间
  state: {
    list: [], // 购物车数组，用于保存添加到购物车中的商品
  },
  getters: {
    // 计算是否所有商品都选中
    allChecked(state) {
      return state.list.every(prod => prod.checked)
    },
    // 合计金额
    totalMoney(state) {
      return state.list.reduce((sum, curr) => {
        if (curr.checked) {
          sum += curr.price * curr.amount
        }
        return sum
      }, 0) * 100
    },
  },
  mutations: { // 同步更新状态数据
    /**
     * 加入购物车
     * @param {*} state
     * @param {*} payload 待添加到购物车中的商品对象
     */
    addToCart(state, payload) {
      // 查询购物车是否有当前选购商品
      const has = state.list.some(prod => prod.id === payload.id)
      if (has) { // 如果有当前选购商品，则当前商品数量 +1
        state.list = state.list.map(prod => {
          const copy = { ...prod }
          if (copy.id === payload.id) {
            copy.amount += 1
          }
          return copy
        })
      } else { // 如果没有当前选购商品，则把当前商品添加到list数组中
        state.list.push({
          ...payload,
          amount: 1, // 商品数量默认为1
          checked: true, // 默认加入购物车的商品是被选中的
        })
      }
    },

    /**
     * 从购物车中删除指定的商品
     * @param {*} state
     * @param {*} payload // 待删除的商品对象
     */
    removeFromCart(state, payload) {
      state.list = state.list.filter(prod => prod.id !== payload.id)
    },

    /**
     * 修改购物车中指定商品的数量
     * @param {*} state
     * @param {*} payload 传递待修改的商品id及修改后的数量值
     */
    modifyAmount(state, payload) {
      state.list = state.list.map(prod => {
        const copy = { ...prod }
        if (copy.id === payload.id) {
          copy.amount = payload.amount
        }
        return copy
      })
    },

    /**
     * 修改商品选中状态
     * @param {*} state
     * @param {*} payload 待修改选中状态的商品对象
     */
    modifyChecked(state, payload) {
      state.list = state.list.map(prod => {
        const copy = { ...prod }
        if (copy.id === payload.id) {
          copy.checked = !copy.checked
        }
        return copy
      })
    },

    /**
     * 全选状态切换
     */
    checkedAll(state, payload) {
      state.list = state.list.map(prod => {
        const copy = { ...prod }
        copy.checked = payload.checked
        return copy
      })
    },
  },
  actions: {
    /**
     * 异步实现加入购物车并更新状态数据
     * @param {*} context 这个对象是与 store 有相同结构的对象
     * @param {*} payload 加购物车时的有效载荷数据
     */
    addToCartAsync(context, payload) {
      // 模拟发送网络请求向后端发送加入购物车商品的信息
      setTimeout(() => {
        console.log('加入购物车成功...')
        // action 中不能直接更新状态数据，需要通过提交 mutation 更新状态数据
        context.commit('addToCart', payload)
      }, 1000)
    },
  },
  modules: {},
}

export default cartModule
